#include"mystdio.h"


_FILE* _fopen(const char* path,const char* mode)
{
    assert(path);
    assert(mode);

    int fd=-1;
    int f=0;

    if(strcmp(mode,"w")==0)
    {
        f=(O_CREAT|O_WRONLY|O_TRUNC);
        fd=open(path,f,FILE_MODE);
    }
    else if(strcmp(mode,"a")==0)
    {
        f=(O_CREAT|O_WRONLY|O_APPEND);
        fd=open(path,f,FILE_MODE);
    }
    else if(strcmp(mode,"r")==0)
    {
        f=(O_RDONLY);
        fd=open(path,f,FILE_MODE);
    }
    
    //如果打开方式不为w/a/r
    if(fd==-1) return NULL;

    _FILE* fp=(_FILE*)malloc(sizeof(_FILE));
    fp->fileno=fd;
   
    //模拟全缓冲的情况
    int flag=FLUSH_ALL;
    int out_pos=0;

    return fp;
    
}

//进程退出之前，也会刷新缓冲区
void _fflush(_FILE* fp)
{
    if(fp->out_pos>0)
    {
        write(fp->fileno,fp->outbuffer,fp->out_pos);
        fp->out_pos=0;
    }
}

void _fclose(_FILE* fp)
{
    assert(fp);
    
    _fflush(fp);
    close(fp->fileno);
    free(fp);
}

int _fwrite(const char* msg,int len,_FILE* fp)
{
    //"abcd\n"
    //"hello linux\n"
    memcpy(&fp->outbuffer[fp->out_pos], msg, len); // 没有做异常处理, 也不考虑局部问题
    fp->out_pos+=len;

    if(fp->flag & FLUSH_NON)
    {
        write(fp->fileno,fp->outbuffer,fp->out_pos); 
        
        //"清空"缓冲区
        fp->out_pos=0;
    }
    else if(fp->flag & FLUSH_LINE)
    {
        if(fp->outbuffer[len-1]=='\n')
        {
            write(fp->fileno,fp->outbuffer,fp->out_pos);
            fp->out_pos=0;
        }
    }
    else if(fp->flag & FLUSH_ALL)
    {
        if(fp->out_pos==SIZE)
        {
            write(fp->fileno,fp->outbuffer,fp->out_pos);
            fp->out_pos=0;
        }
    }
    return len;
}
